package com.itfreer.data.metadata;

import java.util.List;
import java.util.UUID;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;

import com.itfreer.data.metadata.entity.DataMetadataEntity;

/**
 * 元数据注册
 */
@Component
public class MetadataRegServiceImp implements MetadataRegService {

	@Autowired
	private IMetadata metadata;

	@Autowired
	private DefaultMetadataService defaultMetadataService;

	/**
	 * 将表的元数据注册到元数据结构中
	 * 
	 * @param tableName
	 *            表名称
	 * @param mid
	 *            元数据ID
	 * @throws Exception
	 */
	public void reg(String tableName, String mid) throws Exception {
		List<Field> fields = metadata.getFields(tableName);
		reg(fields, mid);
	}

	/**
	 * 将表的元数据注册到元数据结构中
	 * 
	 * @param para
	 *            参数
	 * @throws Exception
	 */
	public void reg(MetadataRegPara para) throws Exception {
		List<Field> fields = metadata.getFields(para.getDriver(), para.getUrl(), para.getUsername(), para.getPassword(),
				para.getTableName());
		reg(fields, para.getMid());
	}

	private void reg(List<Field> fields, String mid) {
		for (Field f : fields) {
			DataMetadataEntity m = new DataMetadataEntity();
			m.setMid(mid);
			m.setId(UUID.randomUUID().toString().replaceAll("-", ""));
			m.setOrder(f.getId());
			m.setAliasName(f.getFieldAliasName());
			m.setName(f.getFieldName());
			if (f.getFieldType().equals("VARCHAR")) {
				if (f.getMaxLen() == 1) {
					m.setDataType("CHAR");
				} else if (f.getMaxLen() <= 256) {
					m.setDataType("STRING");
				} else {
					m.setDataType("TEXT");
				}
			} else if (f.getFieldType().equals("DECIMAL")) {
				if (f.getDecimaldigits() <= 0) {
					if (f.getMaxLen() == 1) {
						m.setDataType("BOOLEAN");
					} else {
						m.setDataType("INT");
					}
				} else {
					m.setDataType("DOUBLE");
				}
			} else if (f.getFieldType().equals("TIME")) {
				m.setDataType("DATETIME");
			} else {
				m.setDataType(f.getFieldType());
			}
			m.setMaxlen(f.getMaxLen());
			m.setDecimaldigits(f.getDecimaldigits());
			m.setDefaultValue(f.getDefValue());
			defaultMetadataService.add(m);
		}
	}
}
